package tp3;





import java.io.IOException;
import java.util.List;


import javax.xml.parsers.ParserConfigurationException;

import org.xml.sax.SAXException;

import Serializadores.SerializarJuego;
import Serializadores.SerializarJugadores;
import Serializadores.SerializarTablero;


public class Juego {

	private Tablero tablero;
	private Vehiculo vehiculo;
	private int nivel;
	
	
	public void setTablero(Tablero tablero){	
			this.tablero = tablero;	
		}
	public void setVehiculo(Vehiculo vehiculo){	
			this.vehiculo = vehiculo;
			
			vehiculo.setPosicion(tablero.getEsquinaInicial());
		}
	public Tablero getTablero() {
		return tablero;
	}
	public Vehiculo getVehiculo() {
		return vehiculo;
	}
	public int getAlto(){
		return tablero.getAlto();
	}	
	
	public int getAncho(){
		return tablero.getAncho();
	}	
	
	public void setNivel(int nivel){
		this.nivel = nivel;
	}
	public int getNivel(){
		return this.nivel;
	}
	
	//nombre del jugador
	public void guardar(){
	
		//	RECIEN CUANDO SE GUARDE EL JUEGO, SE VA A GRABAR LA LISTA DE JUGADORES, YA QUE LA TENGIO QUYE SERIALIZAR.
		String nombre = vehiculo.getJugador().getNombre(); 
		
		SerializarJuego serializadorJuego = new SerializarJuego();
		serializadorJuego.serializar(this,nombre);
		
		
	}
	
	
	public void cargar(String nombre){
		
		//Deserializo
		
		
		try {
			SerializarJuego serializadorJuego = new SerializarJuego();
			
			Juego juegoSalvado = new Juego();
			juegoSalvado = serializadorJuego.deserializar(nombre);
			
			
			//grabo los datos del juego salvado en la instancia actual de juego.
			this.tablero = juegoSalvado.getTablero();
			this.nivel = juegoSalvado.getNivel();
			
			
			this.vehiculo= juegoSalvado.getVehiculo();
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		//this.jugadores = juegoSalvado.listaJugadores();
		
	}
	
	
	public void cargarNivel(String nombre){
		
		try {

			SerializarTablero serTab = new SerializarTablero();
			this.tablero =serTab.deserializar(nombre);
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	
	}
	
	public void jugadorNuevo(String jugador){
		if (!listaJugadores().contains(jugador)){
			SerializarJugadores jugadores = new SerializarJugadores();
			jugadores.guardarJugador(jugador);
		}
		
	}
	
	
	public  List<String> listaJugadores(){
		SerializarJugadores jugadores = new SerializarJugadores();
		
		return jugadores.listaJugadores();
		
	}
	

	public int getColumnaJugador(){
		return tablero.getColumnaEsquina(this.vehiculo.getPosicion());
	}

	public int getFilaJugador(){
		return tablero.getFilaEsquina(this.vehiculo.getPosicion());
	}
	public int getFilaInicial(){
		return tablero.getFilaEsquina(this.tablero.getEsquinaInicial());
	}
	public int getColumnaInicial(){
		return tablero.getColumnaEsquina(this.tablero.getEsquinaInicial());
	}
	public int getFilaFinal(){
		return tablero.getFilaEsquina(this.tablero.getEsquinaFinal());
	}
	public int getColumnaFinal(){
		return tablero.getColumnaEsquina(this.tablero.getEsquinaFinal());
	}
	public boolean gano(){
		return this.llego();
	}
	public boolean perdio(){
		return (!this.llego() & movimientosRestantes() == 0);
		
	}
	public boolean llego(){
		return vehiculo.getPosicion() == tablero.getEsquinaFinal(); 
	}
	public int getPuntos(){
		return (movimientosRestantes() * tablero.getFactorPuntos()); 
	
	}
	public int movimientosRestantes(){
		int mov = (tablero.getCantMaxMovimientos() - vehiculo.getJugador().getMovimientos());
		return (mov < 0) ? 0 : mov;

	}
	
	public void  nuevoJuego(){
		this.cargarNivel("Nivel" + String.valueOf(this.nivel));
		this.getTablero().setEsquinaInicial(tablero.getEsquinas().get((int)(Math.random() * tablero.getEsquinas().size())));
		this.getTablero().setEsquinaFinal(tablero.getEsquinas().get((int)(Math.random() * tablero.getEsquinas().size())));
	}
	public void cargarNivelPrueba (){
		
		Tablero tablero = new Tablero(10,8);
		tablero.setEsquinaInicial(tablero.getEsquinas().get(8));
		tablero.setEsquinaFinal(tablero.getEsquinas().get(55));

		tablero.setCantMaxMovimientos(25);
		this.setTablero(tablero);
		
		Vehiculo vehiculo =  new Vehiculo(new Jugador("Prueba"), new Camioneta());
		this.setVehiculo(vehiculo);
		
		tablero.getCuadras().get(25).setObstaculo(new ControlPolicial());
		tablero.getCuadras().get(25).setSorpresa(new SorpresaFavorable());
		

		tablero.getCuadras().get(15).setSorpresa(new SorpresaCambioDeVehiculo());
		tablero.getCuadras().get(10).setObstaculo(new Piquete());
		tablero.getCuadras().get(111).setObstaculo(new ControlPolicial());
		tablero.getCuadras().get(111).setSorpresa(new SorpresaDesfavorable());
		
		tablero.getCuadras().get(90).setSorpresa(new SorpresaFavorable());
	}
}

